<?php
/**
 * filter_var.php
 * Created by PhpStorm.
 * User: 江小波
 * Date: 2018/12/6
 * Time: 14:26
 */
//$int = 123;
//if(!filter_var($int,FILTER_VALIDATE_INT)){
//    echo ("不是一个合法的整数");
//}else{
//    echo ("是一个合法的整数");
//}

//$get = [];
////$aaaa = $get['aaaa'];
//filter_var($get['aaaa'],FILTER_CALLBACK,["options"=>function($value){
//    var_dump($value);
//}]);

function test(){
    var_dump(func_get_args());
}
$funcRef = new ReflectionFunction('test');
# 或者$funcRef = new ReflectionMethod('class', 'test');
$paramNames = [];
$Parameters = $funcRef->getParameters();
var_dump($Parameters);
foreach($Parameters as $param) {
    $paramNames[] = $param->name;
}

$params = array_fill_keys($paramNames, NULL);
# 使用NULL为默认值，$paramNames为键名，填充一个参数键值对
# 如果参数对应项不传值，则那个值默认是NULL（暂不考虑有默认值的情况）

# 假设从URI获取的键值对生成的数组为$URIParam
# 将$URIParam中的值填入上面生成的参数数组中
# 遍历$params在$URIParam中找的原因是，如果遍历$URIParam，对应的$params中的值都是NULL，无法通过值确定键名是否存在
# 而遍历$params的话，键名一定是参数列表中的，只需要看在$URIParams中是否存在即可
foreach($params as $paramName => $param) {
    if(isset($URIParam[$paramName])) {
        # 使用isset是为了避免直接判断而产生的等效假值问题
        # 如果用if($URIParam[$paramName])无法区分0和''这种等效于假值的值
        $params[$paramName] = $param;
        # 由于，$params中的值已经定义过了，所以此处赋值并不会影响其顺序
    }
}

call_user_func('test', $params);
# 或者call_user_func_array([$class, 'method'], $params);